function [S_EG,D_EG,info_EG] = EG(A_EG)
//
// Funzione EG: calcola la fattorizzazione LR della matrice A_EG.
//
// A_EG: matrice N x N;
// S_EG, D_EG: fattorizzazione LR di A_EG (S_EG triangolare inferiore con
//             S_EG(k,k) = 1, D_EG triangolare superiore, S_EG D_EG = A_EG);
//
// info_EG = -1: la matrice assegnata non è quadrata;
//         =  0: il pivot al passo k è nullo;
//         =  1: la procedura ha determinato la fattorizzazione.
//
// Se info_EG ~= 1 si pone S_EG = D_EG = %nan.
//
info_EG = 1; // resta tale solo se non vi sono errori nel corso della
             // procedura
S_EG = %nan; D_EG = %nan; // restano tali solo se EG(A_EG) non è definita
[NR, NC] = size(A_EG);
if NR ~= NC then
   info_EG = -1; printf("\n *** Errore: matrice non quadrata.\n\n");
else N = NR;
end;
//
if info_EG == 1 then
   for k = 1:N-1, // colonne da 1 a N-1
       if A_EG(k,k) == 0 then
          info_EG = 0; printf("\n *** Errore: pivot nullo al passo %d\n\n",k);
          return;
       else for j = k+1:N, // righe da k+1 a N
                A_EG(j,k) = A_EG(j,k) / A_EG(k,k);
                A_EG(j,k+1:N) = A_EG(j,k+1:N) - A_EG(j,k)*A_EG(k,k+1:NC);
            end;
       end;
    end;
    D_EG = triu(A_EG);
    S_EG = eye(A_EG) + tril(A_EG,-1);
end
endfunction
